/*
*	Universidad del Valle de Guatemala
*	Boris Becerra 12461
*	Pablo Chavac 12331
*	grafico.java
*/

//se importan las librerias a usar de java
import java.io.*;
import javax.swing.*;
import java.awt.*;

public class grafico extends javax.swing.JPanel {
    //el constructor creara todos los componentes
    public grafico() {
        initComponents();
        cargArchivo.setBackground(Color.RED);
        mostOp.setEditable(false);
    }
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        mostOp = new javax.swing.JTextField();
        cargArchivo = new javax.swing.JButton();
        botoSalir = new javax.swing.JButton();

        setBackground(new java.awt.Color(153, 153, 153));

        mostOp.setBackground(new java.awt.Color(204, 204, 204));
        mostOp.setFont(new java.awt.Font("Microsoft YaHei", 1, 18)); // NOI18N
        mostOp.setHorizontalAlignment(javax.swing.JTextField.CENTER);

        cargArchivo.setFont(new java.awt.Font("Microsoft PhagsPa", 1, 12)); // NOI18N
        cargArchivo.setText("Cargar archivo..");
        cargArchivo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cargArchivoActionPerformed(evt);
            }
        });

        botoSalir.setBackground(new java.awt.Color(102, 102, 102));
        botoSalir.setFont(new java.awt.Font("Microsoft PhagsPa", 1, 12)); // NOI18N
        botoSalir.setText("Salir");
        botoSalir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botoSalirActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(mostOp, javax.swing.GroupLayout.DEFAULT_SIZE, 367, Short.MAX_VALUE)
                .addContainerGap())
            .addGroup(layout.createSequentialGroup()
                .addGap(36, 36, 36)
                .addComponent(cargArchivo, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(33, 33, 33)
                .addComponent(botoSalir, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(mostOp, javax.swing.GroupLayout.PREFERRED_SIZE, 72, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(cargArchivo, javax.swing.GroupLayout.DEFAULT_SIZE, 31, Short.MAX_VALUE)
                    .addComponent(botoSalir, javax.swing.GroupLayout.DEFAULT_SIZE, 31, Short.MAX_VALUE))
                .addGap(19, 19, 19))
        );
    }// </editor-fold>//GEN-END:initComponents
    //se hace un action performed para el boton
    private void cargArchivoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cargArchivoActionPerformed
        try{
            //se creara un nuevo comando de filechooser
            JFileChooser eleccion = new JFileChooser();
            //se le cambian los nombres
            eleccion.setApproveButtonText("Elegir");
            eleccion.setDialogTitle("Elija...");
            //se le edita el color y nombre del boton
            cargArchivo.setBackground(Color.GREEN);
            cargArchivo.setText("Cargado..");
            //el resultado se guardara en una variable result y saldra el cuadro de dialogo
            int result = eleccion.showOpenDialog(null);
            //si el resultado sale que si esta aprobado
            if (result == JFileChooser.APPROVE_OPTION){
                //se elije el archivo
                File archivo = eleccion.getSelectedFile();
                try{
                    //se le hace un file reader al archivo y se le bufferea
                    FileReader fileR = new FileReader(archivo);
                    BufferedReader bufferR = new BufferedReader(fileR);
                    //se le creara un nuevo streamtokenizer
                    StreamTokenizer st = new StreamTokenizer(fileR);
                    //variables de inicializacion
                    int c=-9999;
                    int a=0;
                    int b=0;
                    char d=' ';
                    Boolean eof = false;
                    //se creara un nuevo objeto de metodos
                    calcInterface<Integer> metodos = new metodosCalculadora<Integer>();
                    //hasta que el archivo llegue a su final seguira leyendo todas las lineas
                    while (eof != true) {
                        //token guardara el proximo elemento que se encuentre
                        int token = st.nextToken();
                        //si el token es numero entonces
                        if (token == StreamTokenizer.TT_NUMBER){
                            //se agregara un nuevo elemento a la pila
                            metodos.push((int)st.nval);
                        }
                        //si el token llega a su final entonces
                        else if (token == StreamTokenizer.TT_EOF){
                            //determina que se ha llegado a su final
                            eof = true;
                        }
                        //si el token es una letra, no hace nada
                        else if(token==StreamTokenizer.TT_WORD);
                        //si el token es un elemento distinto a numero y letra entonces
                        else{
                            //determina si el token es algun elemento aritmetico (hara lo mismo con los demas)
                            if ((char)token=='+'&& metodos.size()>=2){ 
                                //determina que no este vacio la pila
                                if (metodos.empty()!=true){
                                    //hace pop a los elementos
                                    a=(int)metodos.pop();
                                    b=(int)metodos.pop();
                                    //los suma
                                    c=(b+a);
                                    //guarda el resultado en la pila
                                    metodos.push(c);
                                }
                            }else if ((char)token == '-' && metodos.size()>=2){
                                if (metodos.empty()!=true){
                                    a=(int)metodos.pop();
                                    b=(int)metodos.pop();
                                    c=(b-a);
                                    metodos.push(c);
                                }
                            }else if ((char)token == '*'&& metodos.size()>=2){
                                if (metodos.empty()!=true){
                                    a=(int)metodos.pop();
                                    b=(int)metodos.pop();
                                    c=(b*a);
                                    metodos.push(c);
                                }
                            }else if ((char)token == '/'&& metodos.size()>=2){
                                if (metodos.empty()!=true){
                                    a=(int)metodos.pop();
                                    b=(int)metodos.pop();
                                    c=(b/a);
                                    metodos.push(c); 
                                }
                            }
                        }
                    }
                    //se determina si no hay valores ingresados
                    if (c==-9999){
                        //imprime errores
                        mostOp.setText("ERROR, ingrese datos.");
                        cargArchivo.setBackground(Color.RED);
                        cargArchivo.setText("Cargar Archivo..");
                    }
                    //si hay valores ingresados entonces
                    else{
                        //cambia el texto del jtextfield y botones
                        mostOp.setText("El resultado es: "+c);
                        cargArchivo.setBackground(Color.RED);
                        cargArchivo.setText("Cargar Archivo..");
                    }
                //hace un catch para ver si hay errores
                } catch(Exception e){
                    mostOp.setText("Hubo un error.");   
                }
            }
        }
        //hace chatch para ver si hay errores
        catch (Exception e){
            mostOp.setText("Hubo un error al cargar, intente de nuevo");
        }
    }//GEN-LAST:event_cargArchivoActionPerformed

    private void botoSalirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botoSalirActionPerformed
        System.exit(0);
    }//GEN-LAST:event_botoSalirActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botoSalir;
    private javax.swing.JButton cargArchivo;
    private javax.swing.JTextField mostOp;
    // End of variables declaration//GEN-END:variables

}